{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# neural network（神经网络）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import scipy.io as sio\n",
    "import matplotlib\n",
    "import scipy.optimize as opt\n",
    "from sklearn.metrics import classification_report#这个包是评价报告"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def load_data(path, transpose=True):\n",
    "    data = sio.loadmat(path)\n",
    "    y = data.get('y')  # (5000,1)\n",
    "    y = y.reshape(y.shape[0])  # make it back to column vector\n",
    "\n",
    "    X = data.get('X')  # (5000,400)\n",
    "\n",
    "    if transpose:\n",
    "        # for this dataset, you need a transpose to get the orientation right\n",
    "        X = np.array([im.reshape((20, 20)).T for im in X])\n",
    "\n",
    "        # and I flat the image again to preserve the vector presentation\n",
    "        X = np.array([im.reshape(400) for im in X])\n",
    "\n",
    "    return X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5000, 400)\n",
      "(5000,)\n"
     ]
    }
   ],
   "source": [
    "X, y = load_data('ex3data1.mat')\n",
    "\n",
    "print(X.shape)\n",
    "print(y.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def plot_an_image(image):\n",
    "#     \"\"\"\n",
    "#     image : (400,)\n",
    "#     \"\"\"\n",
    "    fig, ax = plt.subplots(figsize=(1, 1))\n",
    "    ax.matshow(image.reshape((20, 20)), cmap=matplotlib.cm.binary)\n",
    "    plt.xticks(np.array([]))  # just get rid of ticks\n",
    "    plt.yticks(np.array([]))\n",
    "#绘图函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEsAAABLCAYAAAA4TnrqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAABJ5JREFUeJztm0sotH8Ux7/jGrkUuSwYxEqKQZGymLKSJBuSNdZk4bpQ\nlhIrC0tSFmIlK7fCQobESgnJrcltQW7zrn5nzvP3ypx3nhn/t/d8Vt9Oj/H0nXOe8/ud3zMOn88H\nJTAifvoG/ibULAFqlgA1S4CaJUDNEqBmCVCzBKhZAqIkF6empvqcTmeo7uXHOD09hdfrdXx3ncgs\np9OJ5eXlP7+r/ylutzug67QMBahZAkRlGCx8wuFw+B8RERH+7ywyMvLTte/v76Sjovy3HBMTAwB4\neXmhGNf8f9iBZpYANUtAWMuQl9Db2xvp+/t70icnJwCA+Ph4imVlZZE+ODggvbW1BQAoLy+nWHFx\nMWm7B5uaWQLULAG2liFPe15yHx8fAICdnR2KTU5Okj46OiJ9fX0NAIiNjaVYdnY26YuLC9L7+/sA\ngPb2dorxMrQbzSwBapYAW8uQLy69Xi/p4eFhAMDCwgLFXl9fSefm5n7SfHF5fHxM+vLyknRSUhIA\nYGNjg2KPj4+kExMTSdvRGTWzBNiaWfyhPjo6SnpqagoAUFJSQrGOjg7SlZWVpNPS0gAAT09PFDNr\nLwDo7+8nbRrG3d0dxW5ubkibzAM0s8KOmiUg6DI0UwIAODs7I726uko6ISEBANDd3U2xxsZG0vyh\nbNZk/OFcVlZG2jQLAGhoaAAAZGZmUiwjI4O0bnd+EDVLQNBlaMoGsJZAYWEhadPNPB4PxUpLS3/7\nd2YawT+Xr8nW1tZIm2lFfX09xXj58qGhHWhmCVCzBNhahtHR0aRbWlpIr6+vAwDGx8cptrS0RLqu\nro50TU0NAKCgoIBic3NzpEdGRki7XC4A/q4I2D9352hmCXBI1iIul8sX6CEr/4bNg31+fp5i29vb\npM/Pz0k/Pz8DsGYpX4fxLcz09DQA61iZb5MCzTK32w2Px/PtxZpZAtQsASEbK3NMmVRUVFCMn9L0\n9PSQ3tzcBGBtHBxeZrOzswD82ynA2hj4CZIdaGYJULME2FqGX3Ufs+3g4+Guri7Se3t7pKurqwEA\nbW1tFOMj5rGxMdITExMArMNBvg5LT0//dA/BrMM0swSoWQJC9q4DP+l5eHgAAPT29lJsd3eXdGdn\nJ+nm5mYA1vcbeOlUVVWRHhoaAgDMzMxQjB/eDg4Okv6qu0rQzBIQssziJz1ma2M21ABQW1tLuq+v\nj7SZXfEZFp9L8dmXaQJ8hL2yskK6tbWVdE5OzqfPkqKZJUDNEhCyMuRbn+TkZABAXFwcxfibM4uL\ni6RNufByS0lJIX17e0v66uoKgLVk+Zrsq3dY/xTNLAFqloCQlSHf8RcVFQGwdr2BgQHSvGvl5eUB\nAPLz8ylmShOwlq8ZGvL3G5qamkjzt3PsmEBoZglQswSErAz59sL8EoKXG9/OmCEe4B8KHh4eUoxr\n3tVMt+Olx6cVvBsarVOHMBGyzOLfoMkyHjPng//VwcIzmm9tdJ0VZtQsAWH57c7vSsDuk5dA/28w\naGYJULMEiN51cDgcNwBOvr3w7yPH5/OlfXeRyKx/HS1DAWqWADVLgJolQM0SoGYJULMEqFkC1CwB\nvwDVUJSgfZx/PAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x8e262b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "this should be 8\n"
     ]
    }
   ],
   "source": [
    "pick_one = np.random.randint(0, 5000)\n",
    "plot_an_image(X[pick_one, :])\n",
    "plt.show()\n",
    "print('this should be {}'.format(y[pick_one]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def plot_100_image(X):\n",
    "    \"\"\" sample 100 image and show them\n",
    "    assume the image is square\n",
    "\n",
    "    X : (5000, 400)\n",
    "    \"\"\"\n",
    "    size = int(np.sqrt(X.shape[1]))\n",
    "\n",
    "    # sample 100 image, reshape, reorg it\n",
    "    sample_idx = np.random.choice(np.arange(X.shape[0]), 100)  # 100*400\n",
    "    sample_images = X[sample_idx, :]\n",
    "\n",
    "    fig, ax_array = plt.subplots(nrows=10, ncols=10, sharey=True, sharex=True, figsize=(8, 8))\n",
    "\n",
    "    for r in range(10):\n",
    "        for c in range(10):\n",
    "            ax_array[r, c].matshow(sample_images[10 * r + c].reshape((size, size)),\n",
    "                                   cmap=matplotlib.cm.binary)\n",
    "            plt.xticks(np.array([]))\n",
    "            plt.yticks(np.array([]))  \n",
    "            #绘图函数，画100张图片"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nqMVmody7Wnsl1p100klA5qEv40aTnI4//vgCSOghPVWSqEp2FBIaNmyYC9PpeoI6rmvSg/jZZ591\nJWJhneO6r3QO6gzTfbXWWmu5kjXplPREk78UvtD7Fi9e7KY8razc8acABoPBYDDEHHlhptllAUGo\nAF+TTaZOneqsRllEcikFrYk4IZFIONamRJI11lgDKNx0ByWyaMagWIQsq19//ZXLL78c8A3aBbET\nuZii9gboGq644grAW459+/Z16fha16D7JTglIhv5SICQbOl0usZ10VqLbT766KPOUr7vvvsA33xE\nbdqiCldoDdQqTSU6ctnKbbruuuu6a/31118B34xf1632k2JcUSSYaF/FrFU6oiTGdddd1+m83LxK\naiy0V0vrqQQ/rWsikXDn2/777w94Bl4ombWn0gsleumce/jhh12CorwraoYhj5KS2hSm+eGHH9z5\nGJa+S0/kGVTYRJNhdtttN7fW8sipuYcSMuXVy/7MXPfBmKnBYDAYDDkiJ2YqC3LRokXOApAVrrZ1\nagguK/Pss8928bpzzjkH8Iy00FblsiBLc/jw4Y5RyzovREwv24KSVR5sJiGZR4wY4dLdg+0dlaav\nBJowR7AtC1o7xeokx/z5813LQVmPwZF9spxVXL5o0SL3b7Xny2Vv1Dxkk002cQ35gyPKgqx44403\npnfv3gC8/vrrgG/LpkQa7ZP2IGz9kcyyxtXcW+u3ZMkSl8ugJI7XXnsNgK5duwI+SSZKBNdFySLy\npnz22WfOk6FG7B07dgQK59WSPog9Dxs2DKjaQEWeJDWhEAp97gW9irqW3r17u7iu4rzKudCwEnkV\nlXPRpEmT0K9H+qs4uUpkFOstLS11Z4bmsepnPY8kbz5bwhozNRgMBoMhR+TETPV0HzlypItZzJ49\nG4DDDjsM8IOr5WP/7rvv2GyzzQDPSOMwtT0IWZSyaFQQDL4dnJqCR8FQ9R2NGzd2beGefPJJINOc\nAXyMTDGQ2267zWXZyYJXDETlERogoD1p0aJFJJay2L2ySZWx+cADD3DhhRcC3mIOlhTI+p88eTKQ\nafwgZi2GsjKxPe214nENGzZ06yM5a2KVlZWVTp81/knrWOgyjZqalJeUlLiWfYqp654Wy1ZMvRDl\nacEKAa3jE0884eT617/+BfhqgUJl8Wrd1PRCzFQ6W1FRwZ577glE0wBjRaD11T2jbNwePXq47OiH\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x9005198>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_100_image(X)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5000, 400)\n",
      "(5000,)\n"
     ]
    }
   ],
   "source": [
    "raw_X, raw_y = load_data('ex3data1.mat')\n",
    "print(raw_X.shape)\n",
    "print(raw_y.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5000, 401)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# add intercept=1 for x0\n",
    "X = np.insert(raw_X, 0, values=np.ones(raw_X.shape[0]), axis=1)#插入了第一列（全部为1）\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10, 5000)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# y have 10 categories here. 1..10, they represent digit 0 as category 10 because matlab index start at 1\n",
    "# I'll ditit 0, index 0 again\n",
    "y_matrix = []\n",
    "\n",
    "for k in range(1, 11):\n",
    "    y_matrix.append((raw_y == k).astype(int))\n",
    "\n",
    "# last one is k==10, it's digit 0, bring it to the first position，最后一列k=10，都是0，把最后一列放到第一列\n",
    "y_matrix = [y_matrix[-1]] + y_matrix[:-1]\n",
    "y = np.array(y_matrix)\n",
    "\n",
    "y.shape\n",
    "\n",
    "# 扩展 5000*1 到 5000*10\n",
    "#     比如 y=10 -> [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]: ndarray\n",
    "#     \"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 1, 1, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       ..., \n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 1, 1, 1]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# train 1 model（训练一维模型）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def cost(theta, X, y):\n",
    "    ''' cost fn is -l(theta) for you to minimize'''\n",
    "    return np.mean(-y * np.log(sigmoid(X @ theta)) - (1 - y) * np.log(1 - sigmoid(X @ theta)))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def regularized_cost(theta, X, y, l=1):\n",
    "    '''you don't penalize theta_0'''\n",
    "    theta_j1_to_n = theta[1:]\n",
    "    regularized_term = (l / (2 * len(X))) * np.power(theta_j1_to_n, 2).sum()\n",
    "\n",
    "    return cost(theta, X, y) + regularized_term"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def regularized_gradient(theta, X, y, l=1):\n",
    "    '''still, leave theta_0 alone'''\n",
    "    theta_j1_to_n = theta[1:]\n",
    "    regularized_theta = (l / len(X)) * theta_j1_to_n\n",
    "\n",
    "    # by doing this, no offset is on theta_0\n",
    "    regularized_term = np.concatenate([np.array([0]), regularized_theta])\n",
    "\n",
    "    return gradient(theta, X, y) + regularized_term"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def sigmoid(z):\n",
    "    return 1 / (1 + np.exp(-z))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def gradient(theta, X, y):\n",
    "    '''just 1 batch gradient'''\n",
    "    return (1 / len(X)) * X.T @ (sigmoid(X @ theta) - y)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def logistic_regression(X, y, l=1):\n",
    "    \"\"\"generalized logistic regression\n",
    "    args:\n",
    "        X: feature matrix, (m, n+1) # with incercept x0=1\n",
    "        y: target vector, (m, )\n",
    "        l: lambda constant for regularization\n",
    "\n",
    "    return: trained parameters\n",
    "    \"\"\"\n",
    "    # init theta\n",
    "    theta = np.zeros(X.shape[1])\n",
    "\n",
    "    # train it\n",
    "    res = opt.minimize(fun=regularized_cost,\n",
    "                       x0=theta,\n",
    "                       args=(X, y, l),\n",
    "                       method='TNC',\n",
    "                       jac=regularized_gradient,\n",
    "                       options={'disp': True})\n",
    "    # get trained parameters\n",
    "    final_theta = res.x\n",
    "\n",
    "    return final_theta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def predict(x, theta):\n",
    "    prob = sigmoid(x @ theta)\n",
    "    return (prob >= 0.5).astype(int)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "t0 = logistic_regression(X, y[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(401,)\n",
      "Accuracy=0.9974\n"
     ]
    }
   ],
   "source": [
    "print(t0.shape)\n",
    "y_pred = predict(X, t0)\n",
    "print('Accuracy={}'.format(np.mean(y[0] == y_pred)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# train k model（训练k维模型）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10, 401)\n"
     ]
    }
   ],
   "source": [
    "k_theta = np.array([logistic_regression(X, y[k]) for k in range(10)])\n",
    "print(k_theta.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 进行预测\n",
    "* think about the shape of k_theta, now you are making $X\\times\\theta^T$\n",
    "> $(5000, 401) \\times (10, 401).T = (5000, 10)$\n",
    "* after that, you run sigmoid to get probabilities and for each row, you find the highest prob as the answer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "prob_matrix = sigmoid(X @ k_theta.T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.9957736 ,  0.        ,  0.0005348 , ...,  0.0000647 ,\n",
       "         0.00003918,  0.00172193],\n",
       "       [ 0.99834617,  0.0000001 ,  0.00005609, ...,  0.00009687,\n",
       "         0.0000029 ,  0.00008485],\n",
       "       [ 0.99139702,  0.        ,  0.00056824, ...,  0.00000655,\n",
       "         0.02654595,  0.00197376],\n",
       "       ..., \n",
       "       [ 0.00000068,  0.0414034 ,  0.00320872, ...,  0.00012718,\n",
       "         0.00297474,  0.70751222],\n",
       "       [ 0.00001843,  0.00000013,  0.00000009, ...,  0.00164846,\n",
       "         0.06810645,  0.86109385],\n",
       "       [ 0.02881702,  0.        ,  0.00012984, ...,  0.36623328,\n",
       "         0.00498066,  0.14826916]])"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.set_printoptions(suppress=True)\n",
    "prob_matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_pred = np.argmax(prob_matrix, axis=1)#返回沿轴axis最大值的索引，axis=1代表行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 0, ..., 9, 9, 7], dtype=int64)"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_answer = raw_y.copy()\n",
    "y_answer[y_answer==10] = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.97      0.99      0.98       500\n",
      "          1       0.95      0.99      0.97       500\n",
      "          2       0.95      0.92      0.93       500\n",
      "          3       0.95      0.91      0.93       500\n",
      "          4       0.95      0.95      0.95       500\n",
      "          5       0.92      0.92      0.92       500\n",
      "          6       0.97      0.98      0.97       500\n",
      "          7       0.95      0.95      0.95       500\n",
      "          8       0.93      0.92      0.92       500\n",
      "          9       0.92      0.92      0.92       500\n",
      "\n",
      "avg / total       0.94      0.94      0.94      5000\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(classification_report(y_answer, y_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 神经网络模型图示\n",
    "<img style=\"float: left;\" src=\"../img/nn_model.png\">"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def load_weight(path):\n",
    "    data = sio.loadmat(path)\n",
    "    return data['Theta1'], data['Theta2']\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((25, 401), (10, 26))"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "theta1, theta2 = load_weight('ex3weights.mat')\n",
    "\n",
    "theta1.shape, theta2.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " 因此在数据加载函数中，原始数据做了转置，然而，转置的数据与给定的参数不兼容，因为这些参数是由原始数据训练的。 所以为了应用给定的参数，我需要使用原始数据（不转置）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((5000, 401), (5000,))"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X, y = load_data('ex3data1.mat',transpose=False)\n",
    "\n",
    "X = np.insert(X, 0, values=np.ones(X.shape[0]), axis=1)  # intercept\n",
    "\n",
    "X.shape, y.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# feed forward prediction（前馈预测）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "a1 = X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5000, 25)"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "z2 = a1 @ theta1.T # (5000, 401) @ (25,401).T = (5000, 25)\n",
    "z2.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "z2 = np.insert(z2, 0, values=np.ones(z2.shape[0]), axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5000, 26)"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a2 = sigmoid(z2)\n",
    "a2.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5000, 10)"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "z3 = a2 @ theta2.T\n",
    "z3.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.00013825,  0.0020554 ,  0.00304012, ...,  0.00049102,\n",
       "         0.00774326,  0.99622946],\n",
       "       [ 0.00058776,  0.00285027,  0.00414688, ...,  0.00292311,\n",
       "         0.00235617,  0.99619667],\n",
       "       [ 0.00010868,  0.0038266 ,  0.03058551, ...,  0.07514539,\n",
       "         0.0065704 ,  0.93586278],\n",
       "       ..., \n",
       "       [ 0.06278247,  0.00450406,  0.03545109, ...,  0.0026367 ,\n",
       "         0.68944816,  0.00002744],\n",
       "       [ 0.00101909,  0.00073436,  0.00037856, ...,  0.01456166,\n",
       "         0.97598976,  0.00023337],\n",
       "       [ 0.00005908,  0.00054172,  0.0000259 , ...,  0.00700508,\n",
       "         0.73281465,  0.09166961]])"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a3 = sigmoid(z3)\n",
    "a3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5000,)"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred = np.argmax(a3, axis=1) + 1  # numpy is 0 base index, +1 for matlab convention，返回沿轴axis最大值的索引，axis=1代表行\n",
    "y_pred.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 准确率\n",
    " \n",
    "虽然人工神经网络是非常强大的模型，但训练数据的准确性并不能完美预测实际数据，在这里很容易过拟合。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "             precision    recall  f1-score   support\n",
      "\n",
      "          1       0.97      0.98      0.97       500\n",
      "          2       0.98      0.97      0.97       500\n",
      "          3       0.98      0.96      0.97       500\n",
      "          4       0.97      0.97      0.97       500\n",
      "          5       0.98      0.98      0.98       500\n",
      "          6       0.97      0.99      0.98       500\n",
      "          7       0.98      0.97      0.97       500\n",
      "          8       0.98      0.98      0.98       500\n",
      "          9       0.97      0.96      0.96       500\n",
      "         10       0.98      0.99      0.99       500\n",
      "\n",
      "avg / total       0.98      0.98      0.98      5000\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(classification_report(y, y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
